概述
前面介紹了如何使用Spring Kafka開發Consumer,本篇文章則說明一些開發工作以外的眉角。我個人覺得 Spring Boot的最大優點是: "一旦把所有該設定的東西設好後,開發就變得相對簡單"。然而最大的挑戰在於:"誒,他要設定的東西真的有點多"。相信許多從JavaScript或其他直譯式語言轉到 Spring 開發的人應該都能體會這種感受。
以下是我在開發過程中踩雷時,學習到的一些基本知識與筆記,包括:
- 初始化專案
- Maven 簡介
- Trouble shooting 記錄
初始化專案與 IDE 設定
使用 Spring Initializr 生成專案
前面提過,我們可以用Spring Initializr來快速生成初始化套件,這邊說明一些細節及注意事項:
- 依賴的版本
- 請注意,不同版本的Spring Boot所支援的Java版本及Spring Framework版本是不同的。例如Spring Boot 3.0已經不再支援Java 8,要求Java 17或更新的版本,並且需搭配Spring Framework 6.0以上的版本。
- 通常,一些依賴的錯誤修正會需要升級到新的Spring Boot版本,在遇到問題且 Java 版本較舊的情況下,可能要權衡一下,看是要把Java升級,或使用一些替代方案避掉問題。有時候,不一定升到最新版才是最佳解,畢竟升級Java也可能衍生一些別的問題要解決。
- 生成的專案並不包含依賴本身,而是把Starter的配置幫你寫好在設定檔內。我們必須用IDE或者下指令的方式,下載這些 Starter所包含的jar檔(Java 打包後的檔案)。
在IDE中匯入 Maven 專案
- 本專案使用Maven作為專案管理工具,並使用InteliJ這個IDE。
- 在InteliJ中,只需要直接
Open
-> 選擇解壓縮後的目錄即可匯入專案
- 匯入專案後,在專案根目錄點擊右鍵 → Maven → Reload Project或者Download Soruce 即可下載專案依賴:
使用Maven進行專案管理
依賴管例
- Maven是Java用來管理依賴的工具之一,角色就如同Node.js的npm。你可以在官方Repository網站搜尋需要的依賴,該網站會提供該依賴的設定資訊。只要將設定貼到pom.xml,依照上述步驟Reload Project,就可以把套件下載完成。
- Maven會負責管理這些依賴的類別路徑(Class Path),確保專案可以順利的匯入(import)並使用他們。
依賴存放路徑
- 透過Maven下載的依賴,實際上是根據package目錄存放的jar檔,這些檔案會存放在每個用戶的
.m2/repository
目錄,路徑如下:
/Users/User名稱/.m2/repository
- 在某些情況下,我們可能需要手動在此目錄中更新套件,或者移除舊的套件以便重新安裝。
專案的打包與執行
執行方式的選擇
執行Spring程式時,可以選擇使用Spring Boot Maven直接執行,或者先用Maven將Spring 打包成jar檔,然後再使用一般的Java執行方式來執行。後者是一種可以在任何Java環境中執行的可攜式檔案,因此在本專案中,我們選擇使用這種方式來部署。
先用Maven將Spring 打包, 再執行
mvn clean package
java -jar target/xxx.jar
用Spring Boot Maven執行
- 需要在Maven中新增spring-boot-maven-plugin,實際上,使用Spring Initializr創建的專案中的 pom.xml檔案中,已經自動將spring-boot-maven-plugin加入到依賴中。
- 執行指令
mvn spring-boot:run
使用spring-boot-devtools提供的Hot Swapping功能
- Hot Swapping就是容許我們在開發過程中,不用把程式停下來,便可進行即時重新載入(Live Reload),使修改的程式碼或依賴立即生效。Spring提供了devtools來實現這個功能,增加我們開發及測試的效率。
- 只需在pom.xml中加入以下dependency,並在resources/application.properties檔案中加入設定:
- pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
spring.devtools.restart.enabled=true
注意: 因為安全性考量,在正式環境時應把Hot Swapping關掉: Dspring.devtools.restart.enabled=false
Trouble shooting筆記
- 以下是在使用Maven打包或執行Spring時遇過的一些問題,希望可以幫助大家少繞點路:
用mvn打包時出現: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field
- 執行mvn clean package時出現以下錯誤:
Fatal error compiling: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid'
- 這是因為Lombok版本和Spring Boot用的JDK版本不匹配,在Maven指定Lombok版本為1.18.30即可。
- 通常發生在JDK版本很新的狀況。
Dependency版本問題
- 執行mvn clean package,或者執行mvn spring-boot:run 時出現以下錯誤::
class file has wrong version 61.0, should be 57.0
- 這代表使用的dependency用比開發環境更新的JDK版本Build的。
- 解決方式:
- 1.使用比較舊版的dependency。
- 2.升級開發環境的JDK。
Maven: Invalid target release
- 請檢查pom.xml裡面使用java.version是否與執行環境不一致。
No plugin found for prefix 'spring-boot'
- 執行mvn spring-boot:run時出現以下錯誤:
No plugin found for prefix 'spring-boot' in the current project and in the plugin groups
- 這可能是目錄切錯了,在沒有pom.xml的情況下執行時,會出現這個錯誤。
- 請檢查pom中是否包含:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>x.x.x.RELEASE</version>
</parent>
- 注意: x.x.x.RELEASE 需替換成指定的版本。
總結
本篇文章記錄了開發Spring Boot程式過程中會遇到的一些細節和基本觀念。了解這些觀念能幫助我們正確設置 Spring,避免在程式寫好(或根本還沒開始寫)時,就因設定不當而遇到一堆問題卡關。
Citation
https://docs.spring.io/spring-boot/how-to/hotswapping.html